//
//  ArrayViewController.swift
//  StringForSwift
//
//  Created by DeLong Yang on 2017/7/24.
//  Copyright © 2017年 YiXue. All rights reserved.
/*
    swift
    1.0 地址： http://www.cnblogs.com/QianChia/p/5777421.html
    从这些测试的 API 来看。对于 数组 推荐使用NSArray 和 NSMutableArray
    因为这些  官方的 Array 还没有足够的 API 使用 swift 兼容二者
 */

import UIKit

class ArrayViewController: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()
        
//        createArray()
//        calculateLength()
//        arrayIndex()
//        getArrayIndex()
        
//        arrayEqual()
        
//        arrayCombine()
//        appendElement()
//        deleElement()
        
//        replaceElement()
//          exchangeElement()
        
//        modifyElement()
        traversalArray()
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    /*
     在 Swift 语言中，数据在被存储进某个数组之前，类型必须明确，且与数组其他元素类型相同。在 Swift 语言中的数组和 C 语言中的不同，Swift 语言中的数组是值类型的，不管是赋值还是当作参数传递，都只是维护他的拷贝。你可以放心的操作他的拷贝，因为你做的任何操作都不会反馈回它本身，这是值类型自身的规则。
     在 OC 中数组的类型 可以是任意的类型。 并不需要相同的类型
     在 java 中也是要相同的类型
     */
    // 
    func arrayTransferWithNSArray() {
        /*
         Array 与 NSArray 之间可以相互转换。Array 转成 NSArray 时，数组中的各项元素被转换为 AnyObject 类型。NSArray 转换成 Array 时，数组中的各项元素也被转换为 AnyObject 类型。
         */
        // 尤其是 如果元素不同的时候 笔者认为该如何转换呢？？？ 暂时么找到 合适的方法
        let stringArray:Array<String> = ["Hello","De","Long"];
        
        for index in stringArray{
            print(index)
        }
        
        let stringNSArray: NSArray = ["10", "20","30","40","50"]
        for index in stringNSArray{
            print(index)
        }
        
    }
    
    //  create array
    func  createArray() {
        
        // 这些都可以申明一个数组
        let array1 = [String]();
        //
        let arr2 = Array<String>();
        
        let arr3 = ["bei","jing"]
        let  arr4:Array<String> = ["huan","ying"];
        let  arr5 = ["huan","ying"]
        
        //  also can save anyObject element  but this kind of is not remonmended
        let  arr6:[AnyObject] = [333 as AnyObject,1 as AnyObject,3 as AnyObject,"this" as AnyObject];
        print(arr6)
        
        // 二维 数组
        let arr7:[Array<Int>] = [[1,2,3],[4,5,6]];
        
        //  NSArray 数组类型
        let swiftArray:Array = ["bei", "jing", "nin", "hao"]
    
        let nsArray1:NSArray = swiftArray as NSArray  //   其实在3。0 中需要改变这个
        let nsArray3 = NSArray()  // we could use nsarray diretly
        let nsArray4 = NSArray(array: nsArray3)  // has diffrent init method
        
        //
        let nsArray6 = NSArray(array: ["bei","jing"])
        
        nsArray6.adding("huan yin nin")  //  虽然这样写了 但是 实际上并没有起作用 ！！！！
        print(nsArray6)
        
        let nsmuta7 = NSMutableArray(array: ["bei","jing"])
        nsmuta7.add("huan yin nin")
        print(nsmuta7)  //      换成 nsmutableArray 加进去了
        
        //
        let nsArray7 = NSArray(object: "qian")  // we could use OC NSArray instead
        
        //
        let nsArray8 =  NSArray(objects: "hello","swift")
        
        // 从 文件 创建 数组
        let nsArray9:NSArray? = NSArray(contentsOfFile: NSHomeDirectory() + "/Desktop/test.txt")
        
        // 从 Url 创建 数组   but it is not common used
        let nsArray10:NSArray? = NSArray(contentsOf: NSURL(fileURLWithPath: NSHomeDirectory() + "/Desktop/test.txt") as URL)
        
        
    }
    
    // length calculate
    func calculateLength(){
        let array = ["bei", "jing", "huan", "ying", "ni"]
        let num:Int = array.count
        print(num)
    }
    
    // swift zhong array get position 
    func arrayIndex() {
        let array = ["bei", "jing", "huan", "ying", "ni"]
        let startIndex = array.startIndex
        let endIndex = array.endIndex
        
        //
        let index = array.index(startIndex, offsetBy: 2)  // 2
        let index2 = array.index(endIndex, offsetBy: 0)  // 5
        
        print(index)
        print(index2)
        
        // 这个 index 和 string 中的也是有不同的 类型
        let obj = array[index]   // endIndex 实际上 越界了。没有 ObjectAtIndex 这个方法
        
        //  比较着两者的区别  swift 中的array 和 OC中 的array 的区别   有意思
        let nsArray:NSArray = ["bei", "jing", "huan", "ying", "ni"]
        
        // 获取指定下标元素，NSArray 中数据类型为 AnyObject
        let obj5:String = nsArray[2] as! String
        
        // 获取数组指定下标的元素
        let obj6:String = nsArray.object(at: 2) as! String
        print(obj6)
    
        // 获取数组的第一个元素
        let obj7:String = nsArray.firstObject as! String
        
        // 获取数组的最后一个元素
        let obj8:String = nsArray.lastObject as! String
        
        // 获取数组指定范围内的元素
        let obj9 = nsArray.objects(at: NSIndexSet(indexesIn: NSMakeRange(1, 2)) as IndexSet)
        
        // // 获取数组指定范围内的元素
        let obj10 = nsArray.subarray(with: NSMakeRange(2, 2))
        
    }

    // get the array index
    func getArrayIndex()  {
        
        // swift Array
        let array:Array = ["bei", "jing", "huan", "ying", "ni"]
        // 获取指定元素的下标，若元素不存在，返回 nil
        let indexNum1:Int? = array.index(of: "huan")
        print(indexNum1!)
        // NSArray 型数组
        
        let nsArray:NSArray = ["bei", "jing", "huan", "ying", "ni"]
        
        // 获取指定元素的下标，若元素不存在，返回 Int.max
        let indexNum2:Int = nsArray.index(of: "hun")
        print(indexNum2)
        
        if indexNum2 == Int.max {  //   确实输出了 最大值
            print("index is Int max ")
        }
        
        let indexNum3  = nsArray.index(of: "bei")
        print(indexNum3)
        
        //  笔者认为 我们还可以 使用重复的元素。看返回的 还是第一个元素
        let array2:Array = ["bei", "jing", "huan", "ying", "ni","huan","huan"]
        // 获取指定元素的下标，若元素不存在，返回 nil
        let indexNum12:Int? = array2.index(of: "huan")
        print(indexNum12!)
        
        //
        
    }
    
    // we jude equal of two string。also different array and nsarray
    func arrayEqual()  {
        
        // Array 型数组
        let arr1:Array = [1, 3, 5, 8]
        let arr2:Array = [1, 3, 7, 8]
        
        // 判断两个数组是否相等
        let bl1:Bool = arr1 == arr2
        
        // 判断数组是否为空
        let bl2:Bool = arr1.isEmpty
        
        // 判断数组中是否存在指定的元素
        let bl3:Bool = arr1.contains(55)
        
        let arr4:Array = [1, 3, 5, 8]
        let bl4:Bool = arr1 == arr4
        print(bl4)
        
        //
        // NSArray 型数组
        
        let nsArr1:NSArray = [2, 3, 5, 8]
        let nsArr2:NSArray = [1, 4, 7, 9]
        
        // 判断两个数组是否相等
        let bl6:Bool = nsArr1.isEqual(to: nsArr2 as [AnyObject])
        
        // 判断数组中是否存在指定的元素
        let bl5:Bool = nsArr1.contains(7)
        
        // 返回两个数组中第一个相同的元素，没有时返回 nil
        let firstObj:AnyObject? = nsArr1.firstObjectCommon(with: nsArr2 as [AnyObject]) as AnyObject
        
        print(firstObj)  // null 值类型
        print(bl6)
    }
    
    //  array combine suit for nsarray
    func  arrayCombine() {
        // NSArray 型数组
        
        let arr1:NSArray = ["bei", "jing", "huan", "ying", "nin"]
        let arr2:NSArray = ["Users", "JHQ0228", "Desktop"]
        
        // user  through space combine string
        let str1:String = arr1.componentsJoined(by: " ")
        print(str1)
        
        // use file path
        let str2:String = NSString.path(withComponents: arr2 as! [String]);
        
        print(str2)
        
    }
    
    // append element in array
   func appendElement() {
        
        // Array 型数组
        var arr1:Array = ["bei", "jing"]
        
        // 使用 "+" 号连接两个数组
        let arr2 = arr1 + ["huan", "ying", "ni"]
        
        // 在数组末尾追加一个元素
        arr1.append("hao")
        
        // 在指定位置插入一个元素  notice out of bounds
        arr1.insert("ni", at: 2)
        
        arr1.append("ma")
        
        // 我们加入一个 很大的index  看是否越界。实际越界了
//        arr1.insert("ma", at: 10)
//        print(arr1)
//        print(arr2)
        
        // NSArray 型数组
        
        let nsArray:NSMutableArray = ["jing", "huan"]
        
        // 向数组添加一个元素，返回一个新的数组   并没有改变 nsArray
        let nsArray1 = nsArray.adding("ma")
        
        // 在数组末尾追加一个元素  返回的是 一个nil 值
        nsArray.add("ni")
        
        // 在数组末尾追加一个数组
        nsArray.addObjects(from: ["ni", "hao"])
        
        // 在指定位置追加一个元素
        nsArray.insert("bei", at: 0)
        
        print(nsArray1)
        print(nsArray)
    }
    
    // delete element
    func  deleElement() {
        // Array 型数组
        
        var arr1:Array = ["bei", "jing", "huan", "ying", "ni"]
        
        // 删除指定位置的数组元素
        arr1.remove(at: 3)
        
        // 删除数组中的最后一个元素
        arr1.removeLast()
        
        // 删除指定范围内的数组元素   会产生越界 从 0 开始的
        arr1.removeSubrange(1...2)
        
        // 删除所有数组元素
//        arr1.removeAll(keepCapacity: true)
        //  keeping
        arr1.removeAll(keepingCapacity: true)
        
        
        // NSArray 型数组
        
        let nsArr1:NSMutableArray = ["nan", "jing", "huan", "ying", "nin", "bei", "jing", "ni", "hao"]
        
        // 删除指定下标的元素
        nsArr1.removeObject(at: 2)
        
        // 删除指定元素，删除所有指定元素
        nsArr1.remove("ying")
        
        // 删除指定元素
        nsArr1.removeObject(identicalTo: "nan")
        
        // 删除最后一个元素
        nsArr1.removeLastObject()
        
        // 删除指定范围的元素
        nsArr1.removeObjects(in: NSMakeRange(2, 1))
        
        // 删除所有元素
        nsArr1.removeAllObjects()
        
        print(nsArr1)
    }
    
    // replace  for NSMutableArray
    func replaceElement(){
        // NSArray 型数组
        
        let nsArr:NSMutableArray = ["nan", "jing", "huan", "ying", "nin"]
        
        // 替换指定下标元素
        nsArr.replaceObject(at: 0, with: "bei")
        
        let indexSet = NSIndexSet(indexesIn: NSMakeRange(2, 3))
        // 替换的元素个数与被替换的元素个数需相等
        nsArr.replaceObjects(at: indexSet as IndexSet,
                             with: ["ni", "hao", "ma"])
        
        // 用数组替换 从另一个 array 中 指定range 的来替换。某个 array的 指定的range的character
        nsArr.replaceObjects(in: NSMakeRange(2, 3), withObjectsFrom: ["huan", "ying"])
        
        nsArr.replaceObjects(in: NSMakeRange(0, 2),
                             withObjectsFrom: ["huan", "ying", "nin", "nan", "jing", "huan"],
                                    range: NSMakeRange(3, 2))
        
    }
    
    // exchange element。
    func exchangeElement() {
        
        // NSArray 型数组 交换元素的位置
        let nsArr:NSMutableArray = ["bei", "jing", "huan", "ying", "nin"]
        nsArr.exchangeObject(at: 2, withObjectAt: 4)
        print(nsArr)
        
        print("-------")
    }
    
    // modify array 
    func modifyElement() {
        // Array 型数组
        
        var arr:Array = ["bei", "jing", "huan", "ying", "ni"]
        
        arr[0] = "nan"
        
        // NSArray 型数组
        let nsArr:NSMutableArray = ["bei", "jing", "huan", "ying", "nin"]
        
        // 修改数组中的某个元素
        nsArr[4] = "ni"
        
        // 修改整个数组（覆盖重写）
        nsArr.setArray(["ni", "hao"])
        
        print(nsArr)
    }
    
    //   filerElement 
    func filterElement() {
        
        let arr:Array = [1, 9, 2, 8, 45]
        let filterArr:[Int] = arr.filter { (obj) -> Bool in
            return obj%3 == 0
        }
        // 留下 能被3 整除的数字
        print(filterArr)
        
        // NSArray 型数组  在 3.0 没成功
//        let nsArr:NSMutableArray = [1, 9, 2, 8, 45]
//        let nsFilter:NSMutableArray = nsArr.filter { (obj:AnyObject) -> Bool in
//            return (obj as! Int)%3 == 0
//        }
//        print(nsFilter)
    }
    
    //  array traveral
    func traversalArray() {
        
        // Array 或 NSArray 型数组
        let arr = ["bei", "jing", "huan", "ying", "ni"]
        // tmp 无需定义，在 Swift 2.2 中 C 语言样式的 for 循环语句被废弃
        for tmp in arr{
            print(tmp)
        }
        
        // NSArray 型数组  
          //  using block traverse  闭包
        let arr2:NSArray = ["bei", "jing", "huan", "ying", "ni"]
        arr2.enumerateObjects({ (obj, idx, stop:UnsafeMutablePointer<ObjCBool>) in
            print(obj)
            if (obj as! NSString).isEqual(to: "huan"){
                stop.initialize(to: true)
            }
        })
        
         // using enumerator traverse  直接报错 说在强制 解包 一个Optional 对象
//        let enumerator = arr2.objectEnumerator()
//        // as! anyObject 则陷入 死循环
//        while let obj:NSString = enumerator.nextObject() as! NSString{
//            print(obj)
//        }
        
        //  这个 报错 不明白啥原因。
//        let indexSet:NSIndexSet = arr.indexesOfObjectsPassingTest { (obj:AnyObject,
//            idx:Int,
//            stop:UnsafeMutablePointer<ObjCBool>) -> Bool in
//            
//            // 条件满足时返回满足的数组元素的下标
//            return obj.isEqualTo("huan") ? true : false
//        }
//        
//        indexSet.enumerateIndexesUsingBlock { (idx:Int, stop:UnsafeMutablePointer<ObjCBool>) in
//            
//            print(idx)
//        }

    }
    
    // sortElements
    func sortElements() {
        
    }
}




































































































